<?php
/**
 * Created by PhpStorm.
 * User: Kevin
 * Date: 2019/1/18
 * Time: 10:33
 */
namespace wxpay;
use think\Controller;

class Wxpay extends Controller
{
    public function _initialize()
    {
        require_once ROOT_PATH.'extend/wxpay/lib/WxPay.Api.php';
        require_once ROOT_PATH.'extend/wxpay/lib/WxPay.Config.php';
    }

    /**
     * 统一下单支付
     * @param $body 设置商品或支付单简要描述
     * @param $out_trade_no 设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户
     * @param $total_fee 设置订单总金额，只能为整数，详见支付金额
     * @param $notify_url 设置接收微信支付异步通知回调地址
     * @param $trade_type 设置取值如下：JSAPI，NATIVE，APP，详细说明见参数规定
     * @param $product_id 设置trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。
     * @return string|\成功时返回，其他抛异常
     * @throws \WxPayException
     */
    public function wxPayApi($body,$out_trade_no,$total_fee,$notify_url,$trade_type,$product_id){
        $config = new \WxPayConfig();
        $input = new \WxPayUnifiedOrder();
        // 设置商品描述
        $input->SetBody($body);
        // 设置订单号
        $input->SetOut_trade_no($out_trade_no);
        // 设置订单金额（单位：分）
        $input->SetTotal_fee($total_fee);
        // 设置异步通知地址
        $input->SetNotify_url($notify_url);
        // 设置交易类型
        $input->SetTrade_type($trade_type);
        // 设置商品ID
        $input->SetProduct_id($product_id);
        // 调用统一下单API
        $result = \WxPayAPI::unifiedOrder($config,$input);
        // 生成二维码图片
        $code_url = $result['code_url'];
        $img = '<img src="'.qrcode(urldecode($code_url)).'" />';
        return $img;
    }

    /**
     * 回调验签 & xml转array
     * @param $callback
     * @return mixed
     * @throws \WxPayException
     */
    public function wxCheckSing($callback){
        require_once ROOT_PATH.'extend/wxpay/lib/WxPay.Data.php';
        $config = new \WxPayConfig();
        //获取通知的数据
        $xml = file_get_contents('php://input');
        $obj = new \WxPayNotifyResults();
        //接收的xml转array
        $arr = $obj->FromXml($xml);
        //验证签名失败则直接返回失败
        $res = $obj->CheckSign($config);
        if($res == true){
            $result =  $arr;//验签成功返回数组
        }else{
            $result =  '';
        }
        return call_user_func($callback, $result);
    }
}